草庐IT

Java OutOfMemoryError 奇怪的行为

全部标签

c++ - g++ 和 clang++ 与在模板类中定义的友元模板函数的不同行为

另一个类型的问题“g++和clang++之间谁是正确的?”适用于C++标准专家。下面的代码templatestructfoo{templatefriendvoidbar(){}};intmain(){foof0;foof1;}使用clang++编译没有问题(只有两个“未使用的变量”警告)但给出以下错误tmp_002-11,14,gcc,clang.cpp:Ininstantiationof‘structfoo’:tmp_002-11,14,gcc,clang.cpp:27:12:requiredfromheretmp_002-11,14,gcc,clang.cpp:20:16:erro

c++ - 评估潜在常量表达式期间的未定义行为

考虑这个程序:#include#include#includeexterninti;structS{S(){if(i==0){puts("Hello,world!");exit(0);}}};Ss;inti=1+2*INT_MIN;intmain(){}根据我对表达式求值的理解,这是一个严格符合标准的程序,它打印“Hello,world!”,然后退出,并且从不实际求值i的初始化程序:3.6.2Initializationofnon-localvariables[basic.start.init][...]Variableswithstaticstorageduration(3.7.1)

c++ - 奇怪的 std::bad_alloc

据我所知,可以抛出std::bad_alloc的三个原因:进程请求的内存多于可提供的内存地址空间过于分散,无法满足对大块连续内存的请求堆管理数据结构已损坏我们的代码会遇到std::bad_alloc,但上述原因似乎都不适用。数据结构是一个存储为顶点std::list的图,其中每个顶点再次存储一个std::list的边,它是其中的一部分以及一些连续的数据。对于小图(由于在较大的block中分配更多内存时没有问题,因此应排除上述原因1.和2.。在某些部分,我们以一种非常容易出错的方式使用指针,因此我们可能会破坏堆数据结构。但是当在较小的实例上运行时,valgrind的memcheck报告我

c++ - 直接调用析构函数后 `new (this) MyClass();`是不是未定义行为?

在thisquestionofmine,@DeadMG说通过this指针重新初始化一个类是未定义的行为。标准中有没有提到它?例子:#includeclassX{int_i;public:X():_i(0){std::cout~X();new(this)X(5);}voidprint_i(){std::coutExampleoutputatIdeone(我知道UB也可以是“看似正确的行为”)。请注意,我没有在类外部调用析构函数,因为不访问生命周期已结束的对象。另请注意,@DeadMG说直接调用析构函数是可以的,只要它对每个构造函数调用一次即可。 最佳答案

c++ - 为什么 C+ +'s ` 变量模板的行为不符合预期?

#includetemplatestructremove_cvref{usingtype=std::remove_cv_t>;};templateusingremove_cvref_t=typenameremove_cvref::type;templateconstexprboolisCc=std::is_copy_constructible_v>;classAfinal{public:A()=default;template>//errorA(T&&){}};Af(){Aa;returna;}intmain(){}错误信息:error:constexprvariable'isCc'm

c++ - Windows XP 与 Vista/7 上的 MS Crypto API 行为

我正在尝试了解如何在XP、Vista和Windows7中获取从PEM格式(示例包含在下面的代码中)导入的公钥。示例代码将在XP和WindowsVista/7上导入key,但方式不同。在WindowsXP上,密码提供者的名称中需要字符串"(Prototype)",并允许对CryptImportPublicKeyInfo的调用通过。在Windows7上,"(Prototype)"提供程序显然存在,但不支持对CryptImportPublicKeyInfo的调用,这令人困惑。这些操作系统之间的正确实现是什么样的?是否有必要检测XP并请求带有"(Prototype)"的名称,而没有它用于其他操

c++ - MFC 单选按钮 - DDX_Radio 和 DDX_Control 行为

我有一个MFC对话框,其中有两个单选按钮。我把它们放在一个很好的组中,它们的IDC一个接一个(RB_LEFT,RB_RIGHT)。我想使用DDX_Radio,这样我就可以使用整数值访问按钮,所以在函数DoDataExchange中,我调用:DDX_Radio(pDX,RB_LEFT,mRBLeftRight);其中mRBLeftRight是integer类型的成员变量。我还需要编辑按钮属性,所以我想使用DDX_Control将它们映射到成员变量mRBLeft和mRBRight(CButton):DDX_Control(pDX,RB_LEFT,mRBLeft);DDX_Control(p

c++ - 执行限定名称查找时 Clang 和 GCC 之间的不同行为

考虑以下程序:#includenamespaceN{intj=1;}namespaceM{typedefintN;voidf(){std::cout用clang编译它会出现以下编译器错误:prog.cc:10:22:error:'N'(aka'int')isnotaclass,namespace,orenumerationstd::coutGCC不会给出任何编译器错误。我想弄清楚我应该为哪个编译器提交错误报告。哪个编译器具有正确的行为以及原因(对c++标准的引用)?Wandbox-Clang:http://melpon.org/wandbox/permlink/s0hKOxCFPgq5

c++ - 理论上和实践中的未定义行为

我有很久以前别人写的大型C++项目。它包含如下代码:stringCVersion::GetVersionStr()const{stringret;charVersionStr[100];DWORDv1,v2,v3,Build;GetVersion(&v1,&v2,&v3,&Build);sprintf(VersionStr,"%d.%d.%d.%d",v1,v2,v3,Build);returnstring(VersionStr);}现在我认为由于格式说明符(%d)错误,此代码具有未定义的行为。DWORD在我的电脑上声明为typedefunsignedlongDWORD;我的问题是:代

c++ - (int32_t) 255 << 24 是 gcc (C++11) 中的未定义行为吗?

在C++11中,根据en.cppreference.com,Forsignedandnon-negativea,thevalueofaa*2bifitisrepresentableinthereturntype,otherwisethebehaviorisundefined.我的理解是,因为255*224不是表示为int32_t,评价(int32_t)255产生未定义的行为。那是对的吗?这可以吗编译器依赖?如果重要的话,这是一个IP16环境。背景:这来自anargumentIamhaving与arduino.stackexchange.com上的用户。在他看来,“没有什么对此根本没有定